package com.travelshare.common.utils;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.time.DateFormatUtils;

import com.travelshare.common.utils.DateUtils;

public class CommonUtils {
	
	public static String getDate(Date date, int count) {
		Date res = DateUtils.addDays(date, count);
		return DateFormatUtils.format(res, "yyyy-MM-dd");
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static String matchingString(String str, Map<Character, Map> map) {
		if(map == null) {
			return str;
		}
		StringBuilder str1 = new StringBuilder(str);// 转换字符串
		Map<Character, Map> node;// 状态map
		node = map;
		int length = 0;// 计算敏感词的长度
		for (int i = 0; i < str1.length(); i++) {// 遍历字符串//判断状态map是否包字符串的第一个字符
			if (node.containsKey(str1.charAt(i))) {// 包含
				node = node.get(str1.charAt(i));// 状态node指向下一个map
				length++;// 敏感词长度+1//判断下一个map的key为'\t'
				if (node.containsKey('\t')) {// 若果是 开始替换
					for (int j = i - length + 1; j < i + 1; j++) {// 从i - length+1到i+1的位置都替换为*
						str1.deleteCharAt(j);
						str1.insert(j, '*');
					}
					i = i + 1;// i重新从i+1开始遍历length = 0;//敏感词长度变为0
					node = map;// 状态map重新变为主map
				}
				try {// 如果此时是最后一个字符//判断下一个敏感词的key不包含下一个字符
					if (node.containsKey(str1.charAt(i + 1))) {// 如果是继续循环遍历
						continue;
					}
					// else {// 如果不是i = i-1;//回到上一个字符开始遍历}
				} catch (Exception e) {
					break;// 结束
				}
			} else {// 如果第一个node就不包含第一个字符，继续遍历
				continue;
			}
		}
		return str1.toString();
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static Map<Character, Map> saveSensitiveWords(List<String> list) {
		Map<Character, Map> root = new HashMap<>();
		// 头,不要进行操作，只能给node赋值
		Map<Character, Map> node = root;
		// 指针,操作的指针
		for (String str : list) {
			node = root;
			// 每遍历一个敏感词结束后node节点回到root节点，地址，对地址操作
			for (int i = 0; i < str.length(); i++) {
				if (!node.containsKey(str.charAt(i))) {
					// 判断当前节点是否存在字符，不存在则加进去然后node指向下一个空节点
					Map<Character, Map> newMap = new HashMap<>(); // 创建一个新节点
					node.put(str.charAt(i), newMap); // node加入字符
					node = newMap; // node指向新节点，因为只要加了一次就要一直加
				} else { // 如果存在
					node = node.get(str.charAt(i)); // node指向它下一个节点
				}
			}
			node.put('\t', null); // 执行完后node都为空，加入\t结束
		}
		return root; // 返回根节点，根节点都存储着每个敏感词的第一个字符
	}
}
